package com.ruoyi.system.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.google.common.collect.ImmutableMap;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.KuJiaLeHttpUtil;
import com.ruoyi.system.dto.kujiale.AlbumDataResponse;
import com.ruoyi.system.dto.kujiale.HouseTypeResponse;
import com.ruoyi.system.dto.kujiale.PageResponse;
import com.ruoyi.system.dto.kujiale.RenderingResponse;
import com.ruoyi.system.dto.kujiale.drawing.DrawingDetailData;
import com.ruoyi.system.dto.kujiale.info.*;
import com.ruoyi.system.dto.kujiale.pano.RoamItem;
import com.ruoyi.system.service.KuJiaLeService;
import org.apache.commons.compress.utils.Lists;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class KuJiaLeServiceImpl implements KuJiaLeService {

    private static final String design_Basic_Url = "https://openapi.kujiale.com/v2/design/%s/basic/v2";


    // 新增：图纸详情接口URL
    private static final String DRAWING_DETAIL_URL = "https://openapi.kujiale.com/v2/modelview/viewer/detail";

    // 新增：全屋漫游列表API地址
    private static final String ROAM_LIST_URL = "https://openapi.kujiale.com/v2/pano/roam/list";

    // 新增：用户方案列表API地址
    private static final String USER_DESIGN_LIST_URL = "https://openapi.kujiale.com/v2/design/list";

    // 新增：三方图册信息接口URL
    private static final String ALBUM_DATA_URL = "https://openapi.kujiale.com/v2/render/design/albumdata";

    /**
     * 获取方案基础信息
     *
     * @param kujialeDesignId
     * @return
     */
    public HouseTypeResponse getDesignBasic(String kujialeDesignId) {
        String formatUrl = String.format(design_Basic_Url, kujialeDesignId);
        KuJiaLeHttpUtil.ApiResponse<HouseTypeResponse> response = KuJiaLeHttpUtil.get(formatUrl, null, HouseTypeResponse.class);

        if (response.isSuccess()) {
            return response.getData();
        }
        throw new ServiceException("获取设计失败");
    }

    @Override
    public PageResponse<RenderingImage> renderpicList(String kujialeDesignId, int start, int num) {

        String url = "https://openapi.kujiale.com/v2/renderpic/list/v2";

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("design_id", kujialeDesignId);
        jsonObject.put("start", start);
        jsonObject.put("num", num);

        KuJiaLeHttpUtil.ApiResponse<PageResponse<RenderingImage>> response = KuJiaLeHttpUtil.get(url, jsonObject, new TypeReference<PageResponse<RenderingImage>>() {
        });
        if (response.isSuccess()) {
            return response.getData();
        }
        throw new ServiceException("获取失败:" + response.getMessage());
    }

    /**
     * 获取全部方案的渲染图
     *
     * @param kujialeDesignId
     * @return
     */
    @Override
    public List<RenderingResponse> renderpicList(String kujialeDesignId) {
        String url = "https://openapi.kujiale.com/design/%s/renderpics";
        List<RenderingImageV1> data = KuJiaLeHttpUtil.getAllResult(String.format(url, kujialeDesignId), null, new TypeReference<List<RenderingImageV1>>() {
        });
        if (CollectionUtil.isEmpty(data)) {
            throw new ServiceException("获取渲染图为空");
        }

        Map<Integer, String> picTypeNameMap = ImmutableMap.of(1, "普通图", 2, "全景图", 3, "俯视图");
        List<RenderingResponse> result = Lists.newArrayList();
        // 添加所有图片
        result.add(new RenderingResponse("所有图片", data));

        // 分组转换
        Map<Integer, List<RenderingImageV1>> picTypeMap = data.stream().collect(Collectors.groupingBy(RenderingImageV1::getPicType));
        Map<String, List<RenderingImageV1>> roomNameMap = data.stream().collect(Collectors.groupingBy(RenderingImageV1::getRoomTypeName));

        picTypeMap.forEach((k, v) -> {
            RenderingResponse renderingResponse = new RenderingResponse(picTypeNameMap.getOrDefault(k, "其他图"), v);
            result.add(renderingResponse);
        });

        roomNameMap.forEach((k, v) -> {
            RenderingResponse renderingResponse = new RenderingResponse(k, v);
            result.add(renderingResponse);
        });


        return result;
    }


    /**
     * 实现：获取酷家乐发布图纸详情
     */
    @Override
    public DrawingDetailData getDrawingDetail(String designId, Integer level, String orderId, Integer publishSource) {
        // 1. 构建接口请求参数（Query Param，注意参数名与接口文档一致）
        Map<String, Object> params = new HashMap<>();
        // 必选参数：design_id（接口文档参数名，非designId）
        params.put("design_id", designId);
        // 可选参数：非null才添加到请求中
        if (level != null) {
            params.put("level", level);
        }
        if (orderId != null && !orderId.isEmpty()) {
            params.put("order_id", orderId);
        }
        // 可选参数：默认值0（施工图环境发布）
        params.put("publish_source", publishSource == null ? 0 : publishSource);

        // 2. 调用HTTP工具类发送GET请求，解析顶层响应
        KuJiaLeHttpUtil.ApiResponse<DrawingDetailData> httpResponse =
                KuJiaLeHttpUtil.get(DRAWING_DETAIL_URL, params, DrawingDetailData.class);

        // 3. 校验响应是否成功（接口文档：c=0为成功）
        if (!httpResponse.isSuccess()) {
            String errorMsg = String.format("获取图纸详情失败：%s（code=%s）",
                    httpResponse.getMessage(), httpResponse.getCode());
            throw new ServiceException(errorMsg);
        }

        // 4. 获取d字段（图纸详情数据体），校验非空
        DrawingDetailData detailResponse = httpResponse.getData();
        if (detailResponse == null) {
            throw new ServiceException("获取图纸详情失败：响应数据为空");
        }

        return detailResponse;
    }


    /**
     * 实现：获取全屋漫游列表
     */
    @Override
    public List<RoamItem> getRoamList(String appuid, String designId) {
        // 1. 校验必选参数（避免空值传递）
        if (appuid == null || appuid.isEmpty()) {
            throw new ServiceException("获取漫游列表失败：appuid（用户ID）不能为空");
        }
        if (designId == null || designId.isEmpty()) {
            throw new ServiceException("获取漫游列表失败：designId（方案ID）不能为空");
        }

        // 2. 构建API请求参数（Query Param，与API文档一致）
        Map<String, Object> params = new HashMap<>();
        params.put("appuid", appuid);    // 必选：用户ID
        params.put("design_id", designId); // 必选：方案ID（注意API参数名是design_id）

        // 3. 调用HTTP工具类发送GET请求，解析顶层响应
        KuJiaLeHttpUtil.ApiResponse<List<RoamItem>> httpResponse =
                KuJiaLeHttpUtil.get(ROAM_LIST_URL, params, new TypeReference<List<RoamItem>>() {
                });

        // 4. 校验响应状态（API文档：c=0为成功）
        if (!httpResponse.isSuccess()) {
            String errorMsg = String.format("获取漫游列表失败：%s（code=%s）",
                    httpResponse.getMessage(), httpResponse.getCode());
            throw new ServiceException(errorMsg);
        }
        return httpResponse.getData();
    }


    /**
     * 实现：获取用户方案列表
     */
    @Override
    public PageResponse<UserDesignItem> getUserDesignList(String appuid, int start, int num,
                                                          Integer status, Integer sort,
                                                          String keyword, Long time) {
        // 1. 校验必选参数
        if (StringUtils.isBlank(appuid)) {
            throw new ServiceException("获取用户方案失败：用户ID（appuid）不能为空");
        }

        // 2. 构建API请求参数（Query Param，与API文档一致）
        Map<String, Object> params = new HashMap<>();
        params.put("appuid", appuid);          // 必选：用户ID
        params.put("start", start);            // 必选：偏移量
        params.put("num", num);                // 必选：每页数量（已通过PageConvertUtil限制最大50）
        // 可选参数：非null才添加
        if (status != null) {
            params.put("status", status);      // 方案阶段
        }
        if (sort != null) {
            params.put("sort", sort);          // 排序方式
        }
        if (StringUtils.isNotBlank(keyword)) {
            params.put("keyword", keyword);    // 模糊查询
        }
        if (time != null) {
            params.put("time", time);          // 增量时间戳
        }

        // 3. 调用HTTP工具类：用TypeReference解析泛型分页响应
        KuJiaLeHttpUtil.ApiResponse<PageResponse<UserDesignItem>> httpResponse =
                KuJiaLeHttpUtil.get(USER_DESIGN_LIST_URL, params,
                        new TypeReference<PageResponse<UserDesignItem>>() {
                        });

        // 4. 校验响应状态（API文档：c=0为成功）
        if (!httpResponse.isSuccess()) {
            String errorMsg = String.format("获取用户方案列表失败：%s（code=%s）",
                    httpResponse.getMessage(), httpResponse.getCode());
            throw new ServiceException(errorMsg);
        }

        // 5. 校验响应数据非空
        PageResponse<UserDesignItem> pageResponse = httpResponse.getData();
        if (pageResponse == null) {
            throw new ServiceException("获取用户方案列表失败：响应数据为空");
        }
        return pageResponse;
    }


    /**
     * 实现：查询图册信息（调用三方POST接口）
     */
    @Override
    public AlbumDataResponse getAlbumData(String appuid, String designId, Integer sceneTypeId, String lastItemId, Integer num) {
        // 1. 校验必选参数
        if (StringUtils.isBlank(appuid)) {
            throw new ServiceException("查询图册信息失败：用户未绑定酷家乐ID（appuid为空）");
        }
        if (StringUtils.isBlank(designId)) {
            throw new ServiceException("查询图册信息失败：方案ID（designId）不能为空");
        }
        if (sceneTypeId == null || !isValidSceneTypeId(sceneTypeId)) {
            throw new ServiceException("查询图册信息失败：图册类型（sceneTypeId）非法，支持0-6");
        }
        if (num == null || num < 1 || num > 50) { // 参考项目分页规范，限制最大50条
            throw new ServiceException("查询图册信息失败：每页数量（num）需在1-50之间");
        }

        // 2. 构建三方接口Query参数（三方接口参数为Query Param，非请求体）
        Map<String, Object> urlParams = new HashMap<>();
        urlParams.put("appuid", appuid);          // 必选：第三方用户ID
        urlParams.put("design_id", designId);     // 必选：方案ID（与三方接口参数名一致）
        urlParams.put("scene_type_id", sceneTypeId); // 必选：图册类型
        urlParams.put("num", num);                // 必选：每页数量
        if (StringUtils.isNotBlank(lastItemId)) { // 可选：分页标识
            urlParams.put("last_item_id", lastItemId);
        }

        // 3. 调用三方POST接口（参数为Query Param，请求体为空字符串）
        KuJiaLeHttpUtil.ApiResponse<AlbumDataResponse> resp = KuJiaLeHttpUtil.post(
                ALBUM_DATA_URL,
                urlParams,
                "", // POST请求体为空（三方接口参数在Query中）
                AlbumDataResponse.class
        );

        // 4. 校验HTTP响应是否成功
        if (!resp.isSuccess()) {
            String errorMsg = String.format("调用三方图册接口失败：%s（HTTP响应码：%s）",
                    resp.getMessage(), resp.getCode());
            throw new ServiceException(errorMsg);
        }

        // 5. 校验三方接口业务响应是否成功（c=0为成功）
        AlbumDataResponse data = resp.getData();
        if (data == null) {
            throw new ServiceException("查询图册信息失败：三方接口返回空响应");
        }
        return data;
    }

    /**
     * 辅助方法：校验sceneTypeId是否在合法范围（0-6）
     */
    private boolean isValidSceneTypeId(Integer sceneTypeId) {
        return sceneTypeId >= 0 && sceneTypeId <= 6;
    }


    // 新增：三方存档列表接口URL
    private static final String ARCHIVE_LIST_URL = "https://openapi.kujiale.com/v2/archive/list";


    /**
     * 实现：获取存档列表（调用三方GET接口）
     */
    @Override
    public ArchiveResultItem getArchiveList(String appuid, String designId, Integer level, String orderId, Integer start, Integer num) {
        // 1. 校验必选参数
        if (StringUtils.isBlank(appuid)) {
            throw new ServiceException("获取存档列表失败：用户未绑定酷家乐ID（appuid为空）");
        }
        if (StringUtils.isBlank(designId)) {
            throw new ServiceException("获取存档列表失败：方案ID（designId）不能为空");
        }

        // 2. 处理可选参数默认值
        int defaultLevel = 1; // 默认地上第一层
        int defaultStart = 0; // 默认起始游标0
        int defaultNum = 10;  // 默认每页10条（三方限制至多10条）
        level = (level == null) ? defaultLevel : level;
        start = (start == null) ? defaultStart : start;
        num = (num == null) ? defaultNum : num;

        // 3. 校验分页参数合法性（三方限制num≤10）
        if (num < 1 || num > 10) {
            throw new ServiceException("获取存档列表失败：分页数目（num）需在1-10之间（三方接口限制）");
        }

        // 4. 构建三方接口Query参数（与接口文档参数名完全一致）
        Map<String, Object> urlParams = new HashMap<>();
        urlParams.put("appuid", appuid);          // 必选：用户ID（自动添加到公有参数，此处无需重复传）
        urlParams.put("design_id", designId);     // 必选：方案ID（三方参数名design_id）
        urlParams.put("level", level);            // 可选：楼层
        urlParams.put("start", start);            // 可选：起始游标
        urlParams.put("num", num);                // 可选：分页数目
        if (StringUtils.isNotBlank(orderId)) {    // 可选：审核方案ID（非空才传）
            urlParams.put("order_id", orderId);
        }

        // 5. 调用三方GET接口（用TypeReference解析泛型响应）
        KuJiaLeHttpUtil.ApiResponse<ArchiveResultItem> httpResponse =
                KuJiaLeHttpUtil.get(
                        ARCHIVE_LIST_URL,
                        urlParams, false,
                        new TypeReference<ArchiveResultItem>() {
                        }
                );

        // 6. 校验HTTP响应与业务响应合法性
        if (!httpResponse.isSuccess()) {
            String errorMsg = String.format("调用三方存档接口失败：%s（HTTP响应码：%s）",
                    httpResponse.getMessage(), httpResponse.getCode());
            throw new ServiceException(errorMsg);
        }

        ArchiveResultItem outerResponse = httpResponse.getData();
        if (outerResponse == null) {
            throw new ServiceException("获取存档列表失败：三方接口返回空响应");
        }
        return outerResponse;
    }

    // 新增：三方平面布置图片接口URL
    private static final String LAYOUT_LEGEND_IMAGE_URL = "https://openapi.kujiale.com/v2/layout/legend/image";

    /**
     * 实现：获取方案平面布置图片列表
     */
    @Override
    public List<LayoutLegendItem> getLayoutLegendImage(String planId) {

        if (StringUtils.isBlank(planId)) {
            throw new ServiceException("获取平面布置图片失败：方案planId不能为空");
        }

        // 2. 构建三方接口Query参数（参数名与三方接口完全一致：plan_id）
        Map<String, Object> urlParams = new HashMap<>();
        urlParams.put("plan_id", planId);   // 三方接口必填参数（注意下划线命名）

        // 3. 调用三方GET接口（用TypeReference解析泛型响应，适配List类型的d字段）
        KuJiaLeHttpUtil.ApiResponse<List<LayoutLegendItem>> httpResponse = KuJiaLeHttpUtil.get(LAYOUT_LEGEND_IMAGE_URL, urlParams, new TypeReference<List<LayoutLegendItem>>() {
        });

        // 4. 校验HTTP响应合法性（状态码、响应体非空）
        if (!httpResponse.isSuccess()) {
            String errorMsg = String.format("调用三方平面布置接口失败：%s（HTTP响应码：%s）",
                    httpResponse.getMessage(), httpResponse.getCode());
            throw new ServiceException(errorMsg);
        }

        if (CollectionUtil.isEmpty(httpResponse.getData())) {
            throw new ServiceException("获取平面布置图片失败：三方接口返回空响应");
        }
        return httpResponse.getData();
    }


    public static void main(String[] args) {


       /* // 获取渲染图V2
        PageResponse<RenderingImage> renderingResponses = new KuJiaLeServiceImpl().renderpicList("3FO3ICFW3UUL", 0, 10);
        System.out.println(JSON.toJSONString(renderingResponses));

        // 图册信息
        AlbumDataResponse albumData = new KuJiaLeServiceImpl().getAlbumData("122", "3FO3ICFW3UUL", 0, null, 50);
        System.out.println(JSON.toJSONString(albumData));
*/
        //施工存档信息
       /* ArchiveResultItem archiveList = new KuJiaLeServiceImpl().getArchiveList("122", "3FO3IBYSUC5T", null, null, 0, 10);
        System.out.println(JSON.toJSONString(archiveList));

        KuJiaLeHttpUtil.ApiResponse<JSONObject> response = KuJiaLeHttpUtil.get("https://openapi.kujiale.com/v2/archive/generation-status", ImmutableMap.of("design_id", "3FO3IBYSUC5T"), JSONObject.class);

        System.out.println(response.getMessage());

        // 图纸详情
        DrawingDetailData drawingDetail = new KuJiaLeServiceImpl().getDrawingDetail("3FO3IBYSUC5T", null, null, 1);
        System.out.println(JSON.toJSONString(drawingDetail));*/

        // 获取方案的平面布置图片信息
        List<LayoutLegendItem> layoutLegendImage = new KuJiaLeServiceImpl().getLayoutLegendImage("3FO3IBYSUC5T");
        System.out.println(JSON.toJSONString(layoutLegendImage));

        // 绑定账号
        JSONObject urlParam = new JSONObject();

        JSONObject body = new JSONObject();
        body.put("appUid", "122");
        body.put("instanceId", "3FO4J4LTC9MK");

        KuJiaLeHttpUtil.ApiResponse post = KuJiaLeHttpUtil.post("https://openapi.kujiale.com/v2/account/si-instance/bind", urlParam, body.toJSONString());

        System.out.println(post.isSuccess());
        System.out.println(post.getMessage());
//

       /* JSONObject urlParam = new JSONObject();
        urlParam.put("appuid","122");
        String a = "{\n" +
                "  \"isColorImage\": true,\n" +
                "  \"hasFurniture\": true,\n" +
                "  \"hasBackground\": true,\n" +
                "  \"areaType\": 0,\n" +
                "  \"showRoomArea\": true,\n" +
                "  \"showRoomName\": true,\n" +
                "  \"sizeTagType\": 0\n" +
                "}";

        KuJiaLeHttpUtil.ApiResponse<JSONObject> post = KuJiaLeHttpUtil.get("https://openapi.kujiale.com/v2/floorplan/3FO3ICFW3UUL/basic/v2", null, JSONObject.class);

        System.out.println(post.isSuccess());
        System.out.println(post.getMessage());
        System.out.println(post.getData());


        // 获取户型图  https://openapi.kujiale.com/v2/floorplan/{planId}/image

        KuJiaLeHttpUtil.ApiResponse<String> post1 = KuJiaLeHttpUtil.post("https://openapi.kujiale.com/v2/floorplan/3FO3ICFW3UUL/image", urlParam, a, String.class);
        System.out.println(post1.getMessage());
        System.out.println(post1.isSuccess());
        System.out.println(post1.getData());*/

    }

}
